{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "import os\n",
    "from dotenv import load_dotenv\n",
    "load_dotenv()\n",
    "assert 'OPENAI_API_KEY' in os.environ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/homebrew/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
      "  from .autonotebook import tqdm as notebook_tqdm\n"
     ]
    }
   ],
   "source": [
    "import dspy\n",
    "turbo = dspy.OpenAI(model='gpt-3.5-turbo', max_tokens=4000)\n",
    "gpt4 = dspy.OpenAI(model='gpt-4', max_tokens=4000)\n",
    "dspy.settings.configure(lm=turbo)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Prediction(\n",
       "    answer='Paris'\n",
       ")"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dspy.TypedPredictor(\"question -> answer\")(question=\"What is the capital of France?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(20, 50)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from dspy.datasets import HotPotQA\n",
    "\n",
    "# Load the dataset.\n",
    "dataset = HotPotQA(train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0)\n",
    "\n",
    "# Tell DSPy that the 'question' field is the input. Any other fields are labels and/or metadata.\n",
    "trainset = [x.with_inputs('question') for x in dataset.train]\n",
    "devset = [x.with_inputs('question') for x in dataset.dev]\n",
    "\n",
    "len(trainset), len(devset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from dspy.evaluate import Evaluate\n",
    "from dspy.evaluate.metrics import answer_exact_match\n",
    "from dspy.functional import TypedPredictor, TypedChainOfThought\n",
    "from dspy.teleprompt.signature_opt_typed import optimize_signature\n",
    "\n",
    "evaluator = Evaluate(devset=devset, metric=answer_exact_match, num_threads=10, display_progress=True)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "result = optimize_signature(\n",
    "    student=TypedChainOfThought(\"question -> answer\"),\n",
    "    evaluator=evaluator,\n",
    "    initial_prompts=6,\n",
    "    n_iterations=100,\n",
    "    max_examples=30,\n",
    "    verbose=True,\n",
    "    prompt_model=gpt4,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Check the final program after optimization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "result.program"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plot the scores over time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x2b9843290>]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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Dg7iE5/4BGZmZhpfnNoB3H///WoikVC/9a1vqS+++KL6yU9+Uh0cHFSPHz/e6qW1Nddee616zz33qC+88IK6d+9e9frrr1eXL1+uzszMaI+55ZZb1LGxMXXbtm3q7t271be97W3q29/+9hauuv156qmn1JUrV6qrV69WP/3pT2u381j7w8TEhLpixQr1Yx/7mLpr1y71tddeUx955BH11Vdf1R5z5513qgMDA+qDDz6oPvvss+pv/dZvqatWrVLn5+dbuPL244477lBHRkbUhx56SD1w4ID6/e9/X+3t7VW/9rWvaY/hsa6fH//4x+qf/dmfqT/4wQ9UAOoDDzxguN/Nsb3uuuvUyy67TN25c6f6n//5n+q5556r3nTTTQ2vrSPEx5VXXqlu2rRJu14sFtUlS5aoW7dubeGqzjxOnDihAlC3b9+uqqqqTk5OqvF4XP3+97+vPebll19WAag7duxo1TLbmunpafW8885TH330UfVd73qXJj54rP3js5/9rPqOd7zD9v5SqaSOjo6qf//3f6/dNjk5qSaTSfW73/1uEEs8Y/jN3/xN9b//9/9uuO1DH/qQevPNN6uqymPtJ2bx4ebYvvTSSyoA9emnn9Ye85Of/ERVFEU9cuRIQ+s549MuuVwOe/bswfr167XbIpEI1q9fjx07drRwZWceU1NTAIDh4WEAwJ49e5DP5w3H/sILL8Ty5ct57Otk06ZN+M3f/E3DMQV4rP3k3//933H55Zfjt3/7t7Fw4UK85S1vwT//8z9r9x84cADj4+OGYz0wMIC1a9fyWHvk7W9/O7Zt24Zf/epXAIBnn30WTz75JDZs2ACAx7qZuDm2O3bswODgIC6//HLtMevXr0ckEsGuXbsaev3QDZbzm5MnT6JYLGLRokWG2xctWoRf/vKXLVrVmUepVMJtt92Gq666CpdccgkAYHx8HIlEAoODg4bHLlq0COPj4y1YZXtz//334xe/+AWefvrpqvt4rP3jtddew913343NmzfjT//0T/H000/jj/7oj5BIJLBx40bteFp9p/BYe+Nzn/sc0uk0LrzwQkSjURSLRdxxxx24+eabAYDHuom4Obbj4+NYuHCh4f5YLIbh4eGGj/8ZLz5IMGzatAkvvPACnnzyyVYv5Yzk0KFD+PSnP41HH30UqVSq1cs5oymVSrj88svxt3/7twCAt7zlLXjhhRfwjW98Axs3bmzx6s4svve97+E73/kO7rvvPlx88cXYu3cvbrvtNixZsoTH+gznjE+7LFiwANFotMr1f/z4cYyOjrZoVWcWt956Kx566CH87Gc/w7Jly7TbR0dHkcvlMDk5aXg8j7139uzZgxMnTuCtb30rYrEYYrEYtm/fjn/4h39ALBbDokWLeKx9YvHixbjooosMt73pTW/CwYMHAUA7nvxOaZw/+ZM/wec+9zl85CMfwaWXXorf+73fw+23346tW7cC4LFuJm6O7ejoKE6cOGG4v1AoYGJiouHjf8aLj0QigTVr1mDbtm3abaVSCdu2bcO6detauLL2R1VV3HrrrXjggQfw2GOPYdWqVYb716xZg3g8bjj2+/btw8GDB3nsPXLNNdfg+eefx969e7XL5Zdfjptvvln7mcfaH6666qqqkvFf/epXWLFiBQBg1apVGB0dNRzrdDqNXbt28Vh7ZG5uDpGIcRuKRqMolUoAeKybiZtju27dOkxOTmLPnj3aYx577DGUSiWsXbu2sQU0ZFdtE+6//341mUyq9957r/rSSy+pn/rUp9TBwUF1fHy81Utra37/939fHRgYUB9//HH12LFj2mVubk57zC233KIuX75cfeyxx9Tdu3er69atU9etW9fCVZ85yNUuqspj7RdPPfWUGovF1DvuuEN95ZVX1O985ztqd3e3+i//8i/aY+688051cHBQ/eEPf6g+99xz6vvf/36Wf9bBxo0b1aVLl2qltj/4wQ/UBQsWqJ/5zGe0x/BY18/09LT6zDPPqM8884wKQP3yl7+sPvPMM+qvf/1rVVXdHdvrrrtOfctb3qLu2rVLffLJJ9XzzjuPpbZe+Md//Ed1+fLlaiKRUK+88kp1586drV5S2wPA8nLPPfdoj5mfn1f/4A/+QB0aGlK7u7vVD37wg+qxY8dat+gzCLP44LH2jx/96EfqJZdcoiaTSfXCCy9U/+mf/slwf6lUUj//+c+rixYtUpPJpHrNNdeo+/bta9Fq25d0Oq1++tOfVpcvX66mUin17LPPVv/sz/5MzWaz2mN4rOvnZz/7meV39MaNG1VVdXdsT506pd50001qb2+v2t/fr3784x9Xp6enG16boqpSKzlCCCGEkCZzxns+CCGEEBIuKD4IIYQQEigUH4QQQggJFIoPQgghhAQKxQchhBBCAoXigxBCCCGBQvFBCCGEkECh+CCEEEJIoFB8EEIIISRQKD4IIYQQEigUH4QQQggJFIoPQgghhATK/w8hySi9aKQFlAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.plot(result.scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\n",
      "\n",
      "You are an instruction optimizer for large language models.\n",
      "\n",
      "I will give some task instructions I've tried, along with their corresponding validation scores.\n",
      "- The instructions are arranged in order based on their scores, where higher scores indicate better quality.\n",
      "- Your task is to propose a new instruction that will lead a good language model to perform the task even better.\n",
      "- Be creative, and think out of the box.\n",
      "- Don't repeat instructions, descriptions and prefixes that have already been attempted.\n",
      "\n",
      "---\n",
      "\n",
      "Follow the following format.\n",
      "\n",
      "Analysis: Consider what made the previous instructions good or bad.\n",
      "Proposed Signature: A signature that will likely lead to a high score.. Respond with a single JSON object. JSON Schema: {\"properties\": {\"instructions\": {\"description\": \"The instructions for the task\", \"title\": \"Instructions\", \"type\": \"string\"}, \"question_prefix\": {\"description\": \"The prefix for question\", \"title\": \"Question Prefix\", \"type\": \"string\"}, \"question_desc\": {\"description\": \"The description for question\", \"title\": \"Question Desc\", \"type\": \"string\"}, \"answer_prefix\": {\"description\": \"The prefix for answer\", \"title\": \"Answer Prefix\", \"type\": \"string\"}, \"answer_desc\": {\"description\": \"The description for answer\", \"title\": \"Answer Desc\", \"type\": \"string\"}}, \"required\": [\"instructions\", \"question_prefix\", \"question_desc\", \"answer_prefix\", \"answer_desc\"], \"title\": \"SignatureInfo[BasicQA]\", \"type\": \"object\"}\n",
      "Score: The expected score for the new signature. Don't write anything after this number. (Respond with a single float value)\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"You are an expert in your field. Respond to the inquiries with short, factual answers.\",\"question_prefix\":\"Inquiry:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Response:\",\"answer_desc\":\"typically a few words, factual\"}\n",
      "Score: 34.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with extensive knowledge, provide precise and factual responses to the questions. Keep your answers brief, typically within 1-5 words.\",\"question_prefix\":\"Interrogative:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Rejoinder:\",\"answer_desc\":\"a concise, factual answer\"}\n",
      "Score: 34.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a vast database of information, your task is to provide accurate and succinct answers to the following questions. Your responses should be factual and typically consist of 1-5 words.\",\"question_prefix\":\"Prompt:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Retort:\",\"answer_desc\":\"a short, factual answer\"}\n",
      "Score: 34.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with access to a vast knowledge base, your task is to provide accurate, factual answers to the questions posed. The questions will be about various topics, and your responses should be succinct, typically consisting of 1-5 words.\",\"question_prefix\":\"Inquiry:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Response:\",\"answer_desc\":\"a brief, factual answer\"}\n",
      "Score: 34.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a vast reservoir of information, your task is to provide precise, factual answers to the questions asked. Your responses should be succinct, typically consisting of 1-5 words, and cover a wide range of topics.\",\"question_prefix\":\"Enquiry:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Rejoinder:\",\"answer_desc\":\"a brief, factual answer\"}\n",
      "Score: 34.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a vast knowledge base, your task is to provide accurate, factual answers to a wide range of questions. Your responses should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge and understanding.\",\"question_prefix\":\"Inquiry:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Retort:\",\"answer_desc\":\"a brief, factual answer demonstrating accuracy and understanding\"}\n",
      "Score: 34.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a vast knowledge repository, your task is to provide precise, factual answers to the questions posed. Your responses should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy and precision are paramount.\",\"question_prefix\":\"Interrogative:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Rejoinder:\",\"answer_desc\":\"a brief, factual answer demonstrating precision and breadth of knowledge\"}\n",
      "Score: 34.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a comprehensive knowledge repository, your task is to provide precise, factual responses to the inquiries posed. Your answers should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy, precision, and brevity are paramount.\",\"question_prefix\":\"Interrogative Scrutiny:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Succinct Rejoinder:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and understanding\"}\n",
      "Score: 34.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a comprehensive knowledge base, your task is to provide precise, factual answers to the questions posed. Your responses should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy, precision, and brevity are paramount.\",\"question_prefix\":\"Interrogative Inquiry:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Succinct Riposte:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and understanding\"}\n",
      "Score: 34.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a vast knowledge base, your task is to provide accurate, factual answers to the questions posed. Your responses should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a broad spectrum of topics. Accuracy, precision, and brevity are paramount. Consider the context of the question to provide the most relevant answer.\",\"question_prefix\":\"Interrogative Assessment:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Concise Counterpoint:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and understanding\"}\n",
      "Score: 34.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a vast knowledge base, your task is to provide accurate, factual answers to the questions posed. Your responses should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a broad spectrum of topics. Accuracy, precision, and brevity are paramount. Consider the context of the question to provide the most relevant and accurate answer.\",\"question_prefix\":\"Interrogative Analysis:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Concise Clarification:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and understanding\"}\n",
      "Score: 34.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a vast knowledge repository, your task is to provide precise, factual responses to the questions asked. Your answers should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy, precision, and brevity are paramount. Consider the context and nuances of the question to provide the most relevant and accurate answer.\",\"question_prefix\":\"Interrogative Query:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Precise Response:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and contextual understanding\"}\n",
      "Score: 34.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a comprehensive knowledge base, your task is to provide accurate, factual answers to the questions posed. Your responses should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a broad spectrum of topics. Precision, brevity, and accuracy are paramount.\",\"question_prefix\":\"Interrogative Probe:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Concise Rebuttal:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and understanding\"}\n",
      "Score: 36.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a vast knowledge repository, your task is to provide precise, factual responses to the inquiries posed. Your answers should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy, precision, and brevity are paramount.\",\"question_prefix\":\"Interrogative Examination:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Succinct Rejoinder:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and understanding\"}\n",
      "Score: 36.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a comprehensive knowledge base, your task is to provide precise, factual answers to the questions posed. Your responses should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a broad spectrum of topics. Accuracy, precision, and brevity are paramount. Remember, your goal is to provide the most accurate and concise answer possible.\",\"question_prefix\":\"Interrogative Assessment:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Concise Counterpoint:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and understanding\"}\n",
      "Score: 36.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a comprehensive knowledge base, your task is to provide precise, factual answers to the questions posed. Your responses should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a broad spectrum of topics. Accuracy, precision, and brevity are paramount. Additionally, consider the context of the question to provide the most relevant and accurate answer.\",\"question_prefix\":\"Contextual Inquiry:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Contextual Response:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and contextual understanding\"}\n",
      "Score: 36.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with an extensive knowledge base, your task is to provide accurate, factual answers to the questions posed. Your responses should be succinct, typically consisting of 1-5 words, and demonstrate your wide-ranging knowledge across various topics. Accuracy, precision, and brevity are key. Consider the context of the question to provide the most relevant and accurate answer.\",\"question_prefix\":\"Interrogative Exploration:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Concise Clarification:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and understanding\"}\n",
      "Score: 36.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a vast knowledge repository, your task is to provide precise, factual responses to the questions posed. Your answers should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy, precision, and brevity are paramount. Consider the context of the question to provide the most relevant and accurate answer.\",\"question_prefix\":\"Interrogative Exploration:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Precise Rejoinder:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and contextual understanding\"}\n",
      "Score: 36.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a comprehensive knowledge repository, your task is to provide precise, factual responses to the questions posed. Your answers should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics.\",\"question_prefix\":\"Examination:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Rejoinder:\",\"answer_desc\":\"a brief, factual answer demonstrating precision and understanding\"}\n",
      "Score: 38.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a vast knowledge repository, your task is to provide precise, factual responses to the questions posed. Your answers should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy and precision are paramount.\",\"question_prefix\":\"Examination:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Rejoinder:\",\"answer_desc\":\"a brief, factual answer demonstrating precision and understanding\"}\n",
      "Score: 38.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a vast knowledge repository, your task is to provide precise, factual responses to the questions posed. Your answers should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy, precision, and brevity are paramount.\",\"question_prefix\":\"Interrogative Probe:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Succinct Retort:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and understanding\"}\n",
      "Score: 38.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a comprehensive knowledge base, your task is to provide precise, factual responses to the questions posed. Your answers should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy, precision, and brevity are paramount.\",\"question_prefix\":\"Interrogative Query:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Succinct Rebuttal:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and understanding\"}\n",
      "Score: 38.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a vast knowledge repository, your task is to provide precise, factual responses to the questions posed. Your answers should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy, precision, and brevity are paramount. Consider the context of the question to provide the most relevant and accurate answer.\",\"question_prefix\":\"Interrogative Scrutiny:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Precise Rejoinder:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and contextual understanding\"}\n",
      "Score: 38.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a vast knowledge repository, your task is to provide precise, factual responses to the questions posed. Your answers should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy, precision, and brevity are paramount. Consider the context of the question to provide the most relevant and accurate answer.\",\"question_prefix\":\"Interrogative Scrutiny:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Precise Rejoinder:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and contextual understanding\"}\n",
      "Score: 38.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a vast knowledge repository, your task is to provide precise, factual responses to the questions asked. Your answers should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy, precision, and brevity are paramount. Consider the context and nuances of the question to provide the most relevant and accurate answer.\",\"question_prefix\":\"Interrogative Dissection:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Precise Elucidation:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and contextual understanding\"}\n",
      "Score: 38.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a comprehensive knowledge repository, your task is to provide precise, factual responses to the inquiries posed. Your answers should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy, precision, and brevity are paramount.\",\"question_prefix\":\"Interrogative Examination:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Succinct Rejoinder:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and understanding\"}\n",
      "Score: 40.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a comprehensive knowledge repository, your task is to provide precise, factual responses to the inquiries posed. Your answers should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy, precision, and brevity are paramount.\",\"question_prefix\":\"Interrogative Examination:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Succinct Rejoinder:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and understanding\"}\n",
      "Score: 40.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a comprehensive knowledge base, your task is to provide precise, factual answers to the questions posed. Your responses should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a broad spectrum of topics. Accuracy, precision, and brevity are paramount.\",\"question_prefix\":\"Interrogative Assessment:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Concise Counterpart:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and understanding\"}\n",
      "Score: 40.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a comprehensive knowledge repository, your task is to provide precise, factual responses to the questions posed. Your answers should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy, precision, and brevity are paramount. Consider the context and nuances of the question to provide the most relevant and accurate answer.\",\"question_prefix\":\"Interrogative Dissection:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Precise Elucidation:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and contextual understanding\"}\n",
      "Score: 42.0\n",
      "\n",
      "---\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a comprehensive knowledge repository, your task is to provide precise, factual responses to the questions posed. Your answers should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a wide array of topics. Accuracy, precision, and brevity are paramount. Consider the context and nuances of the question to provide the most relevant and accurate answer.\",\"question_prefix\":\"Interrogative Dissection:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Precise Elucidation:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and contextual understanding\"}\n",
      "Score: 42.0\n",
      "\n",
      "---\n",
      "\n",
      "Analysis:\u001b[32m The instructions that scored higher were those that emphasized the AI's extensive knowledge base and its ability to provide precise, factual responses. They also stressed the importance of brevity, typically limiting responses to 1-5 words. The instructions that scored lower did not emphasize these points as strongly. The use of unique prefixes for questions and answers, such as \"Interrogative Dissection\" and \"Precise Elucidation\", seemed to contribute to higher scores as well.\n",
      "\n",
      "Proposed Signature: {\"instructions\":\"As an AI with a comprehensive knowledge base, your task is to provide precise, factual answers to the questions posed. Your responses should be succinct, typically consisting of 1-5 words, and demonstrate your extensive knowledge across a broad spectrum of topics. Accuracy, precision, and brevity are paramount. Consider the context and nuances of the question to provide the most relevant and accurate answer.\",\"question_prefix\":\"Interrogative Probe:\",\"question_desc\":\"${question}\",\"answer_prefix\":\"Concise Clarification:\",\"answer_desc\":\"a brief, factual answer demonstrating precision, brevity, and contextual understanding\"}\n",
      "\n",
      "Score: 44.0\u001b[0m\n",
      "\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "gpt4.inspect_history(n=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Multi-hop\n",
    "Let's try a multi-hop example"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "colbertv2_wiki17_abstracts = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts')\n",
    "dspy.settings.configure(rm=colbertv2_wiki17_abstracts)\n",
    "\n",
    "class GenerateSearchQuery(dspy.Signature):\n",
    "    \"\"\"Write a simple search query that will help answer a complex question.\"\"\"\n",
    "\n",
    "    context:list[str] = dspy.InputField(desc=\"may contain relevant facts\")\n",
    "    question = dspy.InputField()\n",
    "    query = dspy.OutputField()\n",
    "\n",
    "class GenerateAnswer(dspy.Signature):\n",
    "    \"\"\"Answer questions with short factoid answers.\"\"\"\n",
    "\n",
    "    context:list[str] = dspy.InputField(desc=\"may contain relevant facts\")\n",
    "    question = dspy.InputField()\n",
    "    answer = dspy.OutputField(desc=\"often between 1 and 5 words\")\n",
    "\n",
    "from dsp.utils import deduplicate\n",
    "\n",
    "class SimplifiedBaleen(dspy.Module):\n",
    "    def __init__(self, passages_per_hop=3, max_hops=2):\n",
    "        super().__init__()\n",
    "\n",
    "        self.generate_query = [dspy.TypedChainOfThought(GenerateSearchQuery) for _ in range(max_hops)]\n",
    "        self.retrieve = dspy.Retrieve(k=passages_per_hop)\n",
    "        self.generate_answer = dspy.TypedChainOfThought(GenerateAnswer)\n",
    "        self.max_hops = max_hops\n",
    "    \n",
    "    def forward(self, question):\n",
    "        context = []\n",
    "        \n",
    "        for hop in range(self.max_hops):\n",
    "            query = self.generate_query[hop](context=context, question=question).query\n",
    "            passages = self.retrieve(query).passages\n",
    "            context = deduplicate(context + passages)\n",
    "\n",
    "        pred = self.generate_answer(context=context, question=question)\n",
    "        return dspy.Prediction(context=context, answer=pred.answer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Prediction(\n",
       "    context=['Paris (disambiguation) | Paris is the largest city and capital of France.', 'Capital (French magazine) | Capital is a monthly French economics and business magazine published in Paris, France.', 'Paris | Paris (] ) is the capital and most populous city of France, with an administrative-limits area of 105 km2 and a 2015 population of 2,229,621. The city is a commune and department, and the capital-heart of the 12,012 km2 Île-de-France \"region\" (colloquially known as the \\'Paris Region\\'), whose 12,142,802 2016 population represents roughly 18 percent of the population of France. By the 17th century, Paris had become one of Europe\\'s major centres of finance, commerce, fashion, science, and the arts, a position that it retains still today. The Paris Region had a GDP of €649.6 billion (US $763.4 billion) in 2014, accounting for 30.4 percent of the GDP of France. According to official estimates, in 2013-14 the Paris Region had the third-highest GDP in the world and the largest regional GDP in the EU.', \"Administration of Paris | As the capital of France, Paris is the seat of France's national government. For the executive, the two chief officers each have their own official residences, which also serve as their offices. The President of France resides at the Élysée Palace in the 8th arrondissement, while the Prime Minister's seat is at the Hôtel Matignon in the 7th arrondissement. Government ministries are located in various parts of the city; many are located in the 7th arrondissement, near the Matignon.\"],\n",
       "    answer='Paris'\n",
       ")"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "baleen = SimplifiedBaleen()\n",
    "baleen(question=\"What is the capital of France?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Average Metric: 31 / 50  (62.0): 100%|██████████| 50/50 [00:00<00:00, 162.38it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average Metric: 31 / 50  (62.0%)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "/Users/ahle/repos/dspy/dspy/evaluate/evaluate.py:145: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n",
      "  df = df.applymap(truncate_cell)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "62.0"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evaluator(baleen)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "for name, module in baleen.named_sub_modules():\n",
    "    if getattr(module, \"_compiled\", False):\n",
    "        print(\"Found compiled module\", name)\n",
    "\n",
    "result = optimize_signature(\n",
    "    student=baleen,\n",
    "    evaluator=evaluator,\n",
    "    initial_prompts=6,\n",
    "    n_iterations=60,\n",
    "    max_examples=30,\n",
    "    verbose=True,\n",
    "    prompt_model=gpt4,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x178993b50>]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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E4sXL0762KJFi3D48GEA0O4n/00p3D/90z/h61//Oj7xiU/gggsuwD/8wz/grrvuwrp16wDwXpdSNve2q6sLg4ODSZ+PRCIYGhoq+P6f8cGH0+nEkiVLsHnzZu1jsVgMmzdvRl9fXwWvbPoTQuC2227D448/ji1btmD+/PlJn1+yZAkcDkfSve/v78fhw4d573N09dVX4/XXX8err76q/Vi6dClWr16t/X/e6+K4/PLLp4yMv/XWW5g7dy4AYP78+ejq6kq616Ojo9ixYwfvdY7Gx8dhsyU/hux2O2KxGADe61LK5t729fVheHgYu3fv1l6zZcsWxGIxLFu2rLALKKhddZrYtGmTcLlc4pFHHhF79+4Vn//850VLS4sYGBio9KVNa1/60pdEc3OzeO6558Tx48e1H+Pj49prvvjFL4qenh6xZcsWsWvXLtHX1yf6+voqeNVnDuO0ixC818Xy8ssvC1VVxT333CP2798vHn30UVFfXy/++7//W3vNfffdJ1paWsTvfvc78de//lXccMMNHP/Mwy233CJmz56tjdr+5je/ER0dHeKrX/2q9hre6/z5/X7xyiuviFdeeUUAED/60Y/EK6+8It555x0hRHb39oMf/KC4+OKLxY4dO8SLL74ozj77bI7a5uI//uM/RE9Pj3A6neLSSy8V27dvr/QlTXsATH9s2LBBe83ExIT48pe/LFpbW0V9fb346Ec/Ko4fP165iz6DpAYfvNfF8+STT4rzzz9fuFwu0dvbK37+858nfT4Wi4lvfvObwuv1CpfLJa6++mrR399foaudvkZHR8Udd9whenp6hNvtFgsWLBDf+MY3RDAY1F7De52/Z5991vTf6FtuuUUIkd29PXXqlLj55ptFY2Oj8Hg84jOf+Yzw+/0FX5sihGGVHBEREVGJnfE9H0RERFRdGHwQERFRWTH4ICIiorJi8EFERERlxeCDiIiIyorBBxEREZUVgw8iIiIqKwYfREREVFYMPoiIiKisGHwQERFRWTH4ICIiorJi8EFERERl9f8DsVC7vKwTdVoAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.plot(result.scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "for name, module in baleen.named_sub_modules(TypedPredictor):\n",
    "    print(name, module)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py39",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.8"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
